import queue
import random

import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import tkinter as tk


class Graph():
    def __init__(self, root, h, w):
        self.root = root  # 主窗体
        self.canvas = tk.Canvas()  # 创建一块显示图形的画布
        self.figure = self.create_matplotlib(height=h, width=w)  # 返回matplotlib所画图形的figure对象
        self.showGraphIn(self.figure)  # 将figure显示在tkinter窗体上面
        self.data_queue = queue.Queue()
        # 设置固定的y轴刻度范围
        self.y_min, self.y_max = 1, 1.2
    '''生成fig'''

    def create_matplotlib(self, height, width):
        # 创建绘图对象
        f = plt.figure(num=2, figsize=(width, height), dpi=100, edgecolor='green', frameon=True)
        # 创建一副子图
        self.fig11 = plt.subplot(1, 1, 1)
        self.line11, = self.fig11.plot([], [])

        def setLabel(fig, title, titleColor="red"):
            fig.set_title(title + "温度曲线", color=titleColor)  # 设置标题
            fig.set_xlabel('时间[s]')  # 设置x轴标签
            fig.set_ylabel("温度[℃]")  # 设置y轴标签

        setLabel(self.fig11, "设备1")
        #self.fig11.set_yticks([-1, -1 / 2, 0, 1 / 2, 1])  # 设置坐标轴刻度
        f.tight_layout()  # 自动紧凑布局
        return f

    '''把fig显示到tkinter'''

    def showGraphIn(self, figure):
        # 把绘制的图形显示到tkinter窗口上
        self.canvas = FigureCanvasTkAgg(figure, self.root)
        self.canvas.draw()  # 以前的版本使用show()方法，matplotlib 2.2之后不再推荐show（）用draw代替，但是用show不会报错，会显示警告
        self.canvas.get_tk_widget().pack(side=tk.TOP)  # , fill=tk.BOTH, expand=1

        # 把matplotlib绘制图形的导航工具栏显示到tkinter窗口上
        toolbar = NavigationToolbar2Tk(self.canvas,
                                       self.root)  # matplotlib 2.2版本之后推荐使用NavigationToolbar2Tk，若使用NavigationToolbar2TkAgg会警告
        toolbar.update()
        self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

    '''更新fig'''

    def updateMeltGraph(self):
        print(self.data_queue)
        while not self.data_queue.empty():
            data = self.data_queue.get()
            x = [i for i in range(len(data))]
            self.line11.set_xdata(x)  # x轴也必须更新
            self.line11.set_ydata(data)  # 更新y轴数据
            #  更新x数据，但未更新绘图范围。当我把新数据放在绘图上时，它完全超出了范围。解决办法是增加：
            self.fig11.relim()
            self.fig11.autoscale_view()
            # 固定 y 轴的范围
            self.fig11.set_ylim(self.y_min, self.y_max)
            plt.draw()
            # self.canvas.draw_idle()
